home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Languages / Masm V6.11 / README.TXT < prev    next >
Encoding:
Text File  |  1993-09-29  |  28.0 KB  |  700 lines

  1.  
  2.                    README.TXT File
  3.  
  4.            Release Notes for the Microsoft(R) MASM
  5.         Professional Development System, Version 6.11
  6.  
  7.      (C) Copyright 1993, Microsoft Corporation.  All rights reserved.
  8.                       
  9.      This document contains release notes for the Microsoft MASM 
  10.      Professional Development System, version 6.11. The information in 
  11.      this document and in the Microsoft Advisor (online help) is more 
  12.      up-to-date than that in the manuals.
  13.  
  14.      The printed documentation for MASM 6.11 has not changed from MASM 6.1. 
  15.      The MASM 6.11 installation disks provide several important files that 
  16.      include new or updated information for this release. They are:
  17.  
  18.      README.TXT =====> Contains documentation errata, system requirements,
  19.                information and tips on using MASM 6.11, and known 
  20.                assembler bugs.
  21.  
  22.      PENTIUM.TXT ====> Contains .586 and .586P directives information, 
  23.                descriptions of the new Intel(R) Pentium(TM) 
  24.                instructions, and a table of Pentium timings for all 
  25.                instructions.
  26.  
  27.      CV.TXT =========> Contains release notes for Microsoft CodeView(TM).
  28.  
  29.      ERRMSG.TXT =====> Contains updated information on 32-bit Linker errors,
  30.                ML error messages, and Microsoft DOSXNT MS-DOS 
  31.                Extender error messages.
  32.  
  33.      SAMPLES.TXT ====> Contains information about MASM samples for MS-DOS 
  34.                and Microsoft Windows 3.1.
  35.  
  36.      NTSAMPLE.TXT ===> Contains information about MASM samples for 
  37.                Microsoft Windows NT.
  38.  
  39.      SUPPORT.TXT ====> Contains updated Microsoft Product Support policies.
  40.   
  41.  
  42. ======================< README.TXT Table of Contents >=====================
  43.  
  44.      Part 1: Documentation Errata
  45.      ----------------------------
  46.  
  47.      Part 2: System Requirements
  48.      ---------------------------
  49.  
  50.      Part 3: Tips for Using MASM 6.1x
  51.      --------------------------------
  52.          - ALIAS directive
  53.          - Assembling Files Generated by Compiler
  54.          - Building 32-Bit Applications
  55.            - 32-Bit Linking
  56.            - GROUP Directive and Flat-Model Programming
  57.            - Structure Packing Issues for Mixed Language Programming
  58.            - /WIN32 Switch for H2INC
  59.          - CD-ROM Not a Valid Target
  60.          - CMP Instruction Encoding
  61.          - Debugging MASM Applications under Visual C++, 32-Bit 
  62.            Edition, or Fortran PowerStation, 32-Bit Edition
  63.          - .FPO Directive
  64.          - INVOKE Command
  65.          - LINK and System Resources
  66.          - MOUSE.COM
  67.          - MS-DOS and Windows NT File Compatibility
  68.          - Multi-File Assembly with MASM.EXE
  69.          - NMAKE and NMAKER
  70.          - Response Files
  71.          - SAMPLES.TXT and NTSAMPLE.TXT
  72.          - Using Control-C to Halt Operation of MASM
  73.          - Using MASM 6.x Structures
  74.          - Visual C++ 1.0/Fortran PowerStation 1.0 Compatibility
  75.          - Working with MASM 5.1 Code
  76.          - Working With Microsoft BASIC Far Strings
  77.  
  78.      Part 4: Known Assembler Bugs
  79.      ----------------------------
  80.          - Exiting from MS-DOS Critical Errors
  81.          - Expression Order in High-Level Conditionals
  82.          - Hexadecimal Constants
  83.          - Initializing Nested Structures
  84.          - Intersegment Near Jumps in Flat Model
  85.          - Span-Dependent Expressions used in Macros
  86.          - Span-Dependent Equates in Macros and EXTERNDEF ABS
  87.          - Span-Dependent Text Equates
  88.          - STRUCT and RECORD Initialization
  89.          - Using The /link /nologo Command Line Options
  90.  
  91.  
  92.  
  93. ====================< Part 1: Documentation Errata >=======================
  94.  
  95.  
  96.      Environment and Tools, Page xxiii: Microsoft Support Services
  97.      -------------------------------------------------------------
  98.      Microsoft Support Services information has been updated. See
  99.      SUPPORT.TXT, in the directory in which you installed MASM, for
  100.      the most current Microsoft support information and policies.
  101.      
  102.      
  103.      Environment and Tools, Page 582: LIB Command Line Sample
  104.      --------------------------------------------------------
  105.      The following example, as it appears on page 582, is incorrect:
  106.  
  107.      LIB FIRST +SECOND, , THIRD
  108.  
  109.      It should instead read:
  110.  
  111.      LIB THIRD +FIRST +SECOND
  112.  
  113.      
  114.      Environment and Tools, Page 649, 651: _syscall and __syscall
  115.      ------------------------------------------------------------
  116.      The H2INC documentation on pages 649 and 651 lists _syscall and
  117.      __syscall as C keywords recognized by H2INC. These are not recognized,
  118.      and should be removed.
  119.  
  120.      
  121.      Environment and Tools, Page 819: Error Message A2156
  122.      ----------------------------------------------------
  123.      The value range given for the first parameter of the PAGE directive
  124.      is incorrect; "...either 0 or a value in the range of 10-255" should
  125.      read "...either 0 or a value in the range of 14-255."
  126.      
  127.      
  128.      Reference, Page 12: ML Command-line Options /Cu and /Cx
  129.      -------------------------------------------------------
  130.      /Cu is not the default command-line option, but is indicated as such
  131.      in the MASM 6.1 Reference. Instead, /Cx should be indicated as the 
  132.      default.
  133.      
  134.      
  135.      Reference, Page 98: LEA is no longer optimized
  136.      ----------------------------------------------
  137.      The MASM 6.1 Reference indicates that the LEA instruction is
  138.      encoded as a MOV when the source operand is a direct memory address.
  139.  
  140.      In response to programmer requests, MASM 6.1x no longer performs this 
  141.      optimization automatically.  The optimization can be performed by 
  142.      using the OPATTR operator, as shown in the following macro:
  143.  
  144.       MOVLEA MACRO Dest, Symbol
  145.       IF (OPATTR(Symbol)) AND 08h
  146.            MOV Dest, OFFSET Symbol
  147.       ELSE
  148.            LEA Dest, Symbol
  149.       ENDIF
  150.       ENDM
  151.  
  152.      
  153.      Programmer's Guide, Page 156: Using an Emulator Library
  154.      -------------------------------------------------------
  155.      The sample code demonstrating floating-point instructions served
  156.      by an emulator contains the directive .STARTUP. This directive
  157.      should be removed.
  158.  
  159.      
  160.      Programmer's Guide, Page 202: User-Defined Epilogues & Prologues
  161.      ----------------------------------------------------------------
  162.      The documentation for user-defined epilogue and prologue code reads
  163.      "Your macro function must return the parmbytes parameter."  It
  164.      should read "...the localbytes parameter."
  165.  
  166.      
  167.      Programmer's Guide, Page 323: The C++/MASM Interface
  168.      ----------------------------------------------------
  169.      The second sentence in the third paragraph reads: "The linkage 
  170.      specification applies only to called routines, not to external
  171.      variables." It should read "The linkage specification applies to
  172.      called routines and external variables." The last sentence in the
  173.      same paragraph should be removed.
  174.      
  175.      
  176.      Help for Runtime Error R6921
  177.      ----------------------------
  178.      The online help for runtime error R6921 reads "...Possibly the
  179.      CONFIG.SYS file contained a line such as DEVICE=C:\OS\MM386.EXE..."
  180.      The file name should read "C:\DOS\EMM386.EXE".
  181.  
  182.  
  183. =================< Part 2: MASM 6.11 System Requirements >=================
  184.  
  185.      The following are system requirements for Microsoft MASM 6.11:
  186.  
  187.      - Personal computer using a 386 or higher processor running MS-DOS 
  188.        version 3.3 or later, Windows version 3.1 or later, or Windows NT 
  189.        version 3.1 or later.
  190.      - 4 MB of available memory.
  191.      - Hard disk with 10 MB available space.
  192.      - One 3.5" high-density (1.44 MB) disk drive (3.5" low-density (720K) 
  193.        or 5.25" high-density (1.2 MB) disks available separately with 
  194.        coupon enclosed).
  195.  
  196.      To target Windows 3.1, you need one of the following:
  197.  
  198.      - Microsoft Windows Software Development Kit (SDK) 3.1.
  199.      - Microsoft Visual C++ Development System, Standard or Professional 
  200.        Edition.
  201.  
  202.      To target Windows NT, you need one of the following:
  203.  
  204.      - Microsoft Windows NT Software Development Kit (SDK).
  205.      - Microsoft Visual C++ Development System, 32-Bit Edition.
  206.  
  207.  
  208.  
  209. ====================< Part 3: Tips for Using MASM 6.11 >===================
  210.      
  211.      ALIAS directive
  212.      ---------------
  213.      The ALIAS directive is not included in the printed documentation
  214.      for MASM 6.11. The ALIAS directive can be used for creating 
  215.      libraries that allow the linker (LINK) to map an old function to 
  216.      a new function. 
  217.  
  218.      Syntax:    ALIAS  <alias> = <actual-name>
  219.  
  220.      where alias is the alternate or alias name, and actual-name is
  221.      the actual name of the function or procedure. The angle brackets
  222.      are required.
  223.  
  224.      The ALIAS directive should be used with LINK 5.3 or later and LIB
  225.      3.2 or later. At this time, ALIAS functions only with the 16-bit 
  226.      linker.
  227.  
  228.  
  229.      Assembling Files Generated by Compilers
  230.      ------------------------------------------
  231.      Many compilers support assembly-language output.  If you experience
  232.      difficulty assembling the output of such compilers, you may need to
  233.      assemble using the /Zm option.  In some cases (for instance, if the
  234.      compiler inserts nondelimited comments or page numbers) it may be 
  235.      necessary to edit the assembly-language output by hand.
  236.  
  237.  
  238.      Building 32-bit Applications
  239.      ----------------------------
  240.      Following are a number of items you should keep in mind when
  241.      building 32-bit applications with MASM 6.11. Examples of how to 
  242.      create 32-bit applications can be found in the \SAMPLES\NTSAMPLE 
  243.      subdirectory of the directory in which you installed MASM.
  244.  
  245.       32-bit Linking
  246.       --------------
  247.       When you are creating a 32-bit application, you must link 
  248.       separately with a 32-bit linker. To prepare your object files 
  249.       for 32-bit linking, assemble using the following switches:
  250.       
  251.       - /c (assembles without linking)
  252.       - /coff (causes object files to be created in Windows NT-
  253.         compatible common object file format)
  254.         
  255.       After assembling, link with your 32-bit linker. Refer to the 
  256.       documentation included with your particular 32-bit linker for 
  257.       specific information and instructions. In addition, the sample
  258.       NT applications in \SAMPLES\NTSAMPLE demonstrate the use of
  259.       /c, /coff, and a 32-bit linker.
  260.  
  261.       GROUP Directive and Flat-Model Programming
  262.       ------------------------------------------
  263.       The GROUP directive has no effect when used in 32-bit flat-model
  264.       programming. It is recommended that you not use the GROUP 
  265.       directive when programming in flat model.
  266.  
  267.       Structure Packing Issues for Mixed Language Programming
  268.       -------------------------------------------------------
  269.       Microsoft MASM uses /Zp1 as it's default setting for structure 
  270.       packing; this means that structures are not packed. Other 
  271.       languages may use other default settings for packing. For 
  272.       example, Microsoft C/C++ compilers prior to Visual C++ 32-bit 
  273.       edition use /Zp2; Visual C++ 32-bit edition uses /Zp8 as the 
  274.       default. Modules built using different structure packing may not 
  275.       be able to share structure data items, so care must be taken 
  276.       when using structures in mixed language programs.
  277.  
  278.       The packing size is a maximum, not a fixed, packing value. This 
  279.       means that a member must have a size equal to or larger than the 
  280.       packing limit before any packing is done. In many cases, using 
  281.       /Zp4 on assembly modules will allow them to work with other 
  282.       modules compiled with /Zp8 if none of the members have a size 
  283.       larger than 4 bytes. Doubles, long doubles, and member structures 
  284.       larger than 4 bytes will cause problems. If a structure contains 
  285.       members larger than 4 bytes you will need to pack the structure 
  286.       yourself by adding "dummy" data items.
  287.  
  288.       /WIN32 Switch for H2INC
  289.       -----------------------
  290.       Use the /WIN32 switch with H2INC to convert C header files to 
  291.       NT-compatible MASM include files. When you use the /WIN32 switch,
  292.       C int data types are converted to the 4-byte assembler equivalent
  293.       DWORD (signed int data types are converted to SDWORD). Without 
  294.       the /WIN32 switch, H2INC converts int data types to 2-byte WORD 
  295.       (and signed int data types to SWORD).
  296.  
  297.     
  298.      CD-ROM Not a Valid Target
  299.      -------------------------
  300.      A CD-ROM drive is not a valid installation target for MASM 6.11.
  301.  
  302.  
  303.      CMP Instruction Encoding
  304.      ------------------------
  305.      MASM 6.1x uses a different encoding for the CMP <reg8>,<reg8> 
  306.      instruction than MASM 6.0 did.  There is no difference in length or 
  307.      processor timing.
  308.  
  309.      
  310.      Debugging MASM Applications under Visual C++, 32-bit Edition, 
  311.      or Fortran PowerStation, 32-bit Edition
  312.      -------------------------------------------------------------
  313.      When debugging a pure MASM application under the 32-bit editions of
  314.      Visual C++ or Fortran PowerStation, you must link in the library 
  315.      file (.LIB) provided with these high-level languages (LIBC.LIB in 
  316.      Visual C++, LIBF.LIB with Fortran PowerStation), instead of the one 
  317.      included with MASM 6.11. If you do not use the .LIB file included in 
  318.      the high-level language, you will receive an "Access Violation" 
  319.      error message when you attempt to run a MASM application in either 
  320.      the 32-bit Visual C++ or 32-bit Fortran PowerStation integrated 
  321.      development environment.
  322.  
  323.      
  324.      .FPO Directive
  325.      --------------
  326.      The .FPO directive controls the emission of debug records to the
  327.      .debug$F segment or section. This directive was originally included 
  328.      with MASM386 and is not supported by MASM 6.11. If you are using 
  329.      both MASM 6.11 and MASM386, the following allows you to continue to 
  330.      implement the .FPO directive:
  331.  
  332.      IF @version LT 600
  333.      .FPO
  334.      ENDIF
  335.      
  336.      
  337.      INVOKE Command
  338.      --------------
  339.      The MASM 6.x INVOKE command does not support transferring control
  340.      between 16-bit and 32-bit code segments. When the assembler
  341.      encounters an INVOKE command in a 16-bit segment, it assumes
  342.      that the procedure being invoked is also in a 16-bit segment; if
  343.      the assembler encounters an INVOKE in a 32-bit segment, it assumes
  344.      that the invoked procedure is also in a 32-bit segment.
  345.  
  346.      To avoid this problem, push the necessary parameters on the stack
  347.      and make the appropriate call instead of using INVOKE.
  348.  
  349.  
  350.      LINK and System Resources
  351.      ------------------------
  352.      You may encounter the following error message when running LINK on 
  353.      Windows 3.1:
  354.       
  355.       System resource exhausted. Abort, Retry, Fail?
  356.  
  357.      This may occur because LINK opens a large number of files, and the 
  358.      buffer for SHARE may have been exceeded. To fix this problem, edit 
  359.      your AUTOEXEC.BAT, setting the following values for SHARE:
  360.  
  361.       /L:500 /F:4096
  362.  
  363.      
  364.      MOUSE.COM
  365.      ---------
  366.      Microsoft Mouse Driver (MOUSE.COM) Version 8.20a is included with
  367.      MASM 6.11. If you have a later version of the Microsoft Mouse
  368.      installed on your system, it is recommended you use it instead of
  369.      the Mouse Driver included with MASM 6.11.
  370.      
  371.  
  372.      MS-DOS and Windows NT File Compatibility
  373.      ----------------------------------------
  374.      Files installed on the Microsoft Windows NT File System (NTFS) are 
  375.      accessible only on Microsoft Windows NT.  Files installed on the 
  376.      MS-DOS File System (FAT) are accessible on MS-DOS, Microsoft Windows, 
  377.      or Microsoft Windows NT.
  378.  
  379.  
  380.      Multi-File Assembly with MASM.EXE
  381.      ---------------------------------
  382.      When assembling multiple files with MASM.EXE, you must terminate the
  383.      command-line with a semi-colon or a comma (for example, MASM *.asm;). 
  384.      Failure to do this may cause the program to appear to hang if you are 
  385.      running Microsoft NT. If this does occur, you can terminate the program 
  386.      with Ctrl+C.
  387.      
  388.  
  389.      NMAKE and NMAKER
  390.      ----------------
  391.      MASM 6.11 includes two versions of the NMAKE project management 
  392.      utility.  NMAKER.EXE is a real-mode version of the utility.  
  393.      NMAKE.EXE is a driver program which first loads the MS-DOS extender 
  394.      DOSXNT into memory, and then runs NMAKER.EXE.  Using the NMAKE.EXE 
  395.      driver will result in faster build times.  Some development tools 
  396.      from other manufacturers may be incompatible with NMAKE.EXE.  If you 
  397.      encounter incompatibilities, use NMAKER.EXE instead.
  398.  
  399.  
  400.      Response Files
  401.      --------------
  402.      Information on response files is not included in the MASM 6.1 manuals;
  403.      however, this information can be found in "ML Command Line Options" 
  404.      in Online help.
  405.      
  406.      
  407.      SAMPLES.TXT and NTSAMPLE.TXT
  408.      ----------------------------
  409.      SAMPLES.TXT contains information about the MASM samples for 
  410.      MS-DOS/Windows; NTSAMPLE.TXT contains information about the 
  411.      samples given for MASM for Windows NT. Both files include 
  412.      information about additional tools you may need to build some 
  413.      of the samples. If you choose to install the sample code during the 
  414.      setup process, both SAMPLES.TXT and NTSAMPLE.TXT are included. 
  415.      SAMPLES.TXT can be found in the \MASM611\SAMPLES subdirectory;
  416.      NTSAMPLE.TXT can be found in the \MASM611\SAMPLES\NTSAMPLE
  417.      subdirectory.
  418.  
  419.  
  420.      Using Control-C to Halt Operation of MASM
  421.      -----------------------------------------
  422.      MS-DOS applications running under DPMI, such as ML.EXE, may not 
  423.      respond immediately to pressing Control-C.  If you press Control-C, 
  424.      and ^C appears on the screen but you are not returned to MS-DOS, 
  425.      press the Enter key.
  426.  
  427.  
  428.      Using MASM 6.x Structures
  429.      -------------------------
  430.      MASM 6.x supports a more powerful syntax for structure definition 
  431.      and usage than previous versions of MASM.  This more powerful 
  432.      syntax is enabled by default.  To use the older syntax, issue 
  433.      the OPTION OLDSTRUCTS directive (see Appendix A of the MASM
  434.      Programmer's Guide for more information).
  435.  
  436.      Note: use of nested structures requires the new MASM 6.x syntax.
  437.      If you use nested structures, the OPTION OLDSTRUCTS directive will
  438.      be ignored for the structure which is nested.
  439.  
  440.  
  441.      Visual C++ 1.0/Fortran PowerStation 1.0 Compatibility
  442.      -----------------------------------------------------
  443.      There are specific steps you must take to use MASM 6.11 with 
  444.      Microsoft Visual C++ 1.0 or Microsoft Fortran PowerStation 1.0.  
  445.      If you wish to do mixed language programming with these products, it 
  446.      is recommended that:
  447.  
  448.      - You install Visual C++/Fortran PowerStation and MASM 6.11 in 
  449.        separate sub-directories.
  450.  
  451.      - You place \MSVC\BIN or \F32\BIN (your Visual C++ or Fortran 
  452.        PowerStation sub-directory) first on your path statement before 
  453.        \MASM611\BIN (your MASM 6.11 sub-directory).
  454.  
  455.      - You use NMAKE.EXE from MASM 6.11.  You can do this using various
  456.        methods, such as moving or renaming NMAKE.EXE installed in \MSVC
  457.        or \F32 thus causing the system to continue searching your path 
  458.        and use the NMAKE.EXE in \MASM611.
  459.  
  460.      Optionally, for MASM 6.11/Visual C++ mixed programming, you may
  461.      use NMAKER.EXE which is installed with both products.
  462.  
  463.      When using the LINK utility included with Visual C++ 1.0, you may 
  464.      encounter one or both of the following warnings:
  465.  
  466.       LINK : warning L4017: /r : unrecognized option name; option 
  467.                      ignored
  468.       CVPACK : warning CK4007 : unrecognized option /x; option 
  469.                     ignored
  470.      
  471.      These warnings do not affect the resulting program and should be
  472.      ignored.
  473.      
  474.  
  475.      Working with MASM 5.1 Code
  476.      --------------------------
  477.      MASM 6.x offers major advances over previous versions of MASM.
  478.      Some of these improvements require changes that make MASM 5.1
  479.      source code incompatible with MASM 6.x. To provide compatibility
  480.      with code written for MASM 5.1, MASM 6.x allows you to access
  481.      MASM 5.1 compatibility code in three ways:
  482.      
  483.       - By using the conversion driver MASM.EXE. MASM.EXE converts
  484.         your existing command-line options to the new syntax, adds
  485.         the compatibility option /Zm, and invokes ML.EXE.
  486.       
  487.       - By using ML.EXE with the /Zm option. You also need to
  488.         convert command-line options to the new syntax.
  489.       
  490.       - By placing the statement OPTION M510 at the beginning of
  491.         each file. You also need to convert command-line options
  492.         to the new syntax.
  493.         
  494.      In most cases, using the /Zm option or OPTION M510 will be the best
  495.      solution for assembling existing code. If you prefer to modify your
  496.      code so it can be assembled without /Zm or OPTION M510, do the
  497.      following:
  498.      
  499.      1. Add the appropriate OPTION directives to your code.
  500.  
  501.     - Always add the following:
  502.  
  503.       OPTION OLDSTRUCTS ; Supports old-style structures
  504.       OPTION OLDMACROS  ; Supports old-style macros
  505.       OPTION DOTNAME    ; Supports naming identifiers with
  506.                 ; a leading dot [.]
  507.  
  508.     - If your code does not specify the .386 or .386P directive, add
  509.       the following:
  510.  
  511.       OPTION EXPR16     ; Use 16-bit precision in expressions
  512.  
  513.     - If your code does not contain a .MODEL directive, add the
  514.       following:
  515.  
  516.       OPTION OFFSET:SEGMENT ; Specifies that the OFFSET operator
  517.                 ; defaults to segment-relative rather
  518.                 ; than group-relative
  519.  
  520.     - If your code does not contain a .MODEL directive or if the
  521.       .MODEL directive does not specify a language, add the following:
  522.  
  523.       OPTION NOSCOPED       ; Makes code labels global rather than
  524.                 ; local to the procedure in which they
  525.                 ; appear
  526.       OPTION PROC:PRIVATE   ; Makes code labels defined with PROC
  527.                 ; local unless specified otherwise
  528.  
  529.      2. Once your code assembles with the OPTION directives, remove each 
  530.     OPTION directive, one at a time, and reassemble the code after you 
  531.     remove each one.
  532.  
  533.     Usually, it is best to remove the OPTION directives in the 
  534.     opposite order in which you added them. In some cases, you may 
  535.     decide that you prefer the MASM 5.x compatibility behavior 
  536.     instead of the new MASM 6.x behavior. When this is true, do not 
  537.     remove the corresponding OPTION statement from your code. 
  538.     
  539.      For more information on assembling MASM 5.1 code, see Appendix A 
  540.      of the MASM Programmer's Guide.
  541.  
  542.      
  543.      Working With Microsoft BASIC Far Strings
  544.      ---------------------------------------------
  545.      The BASIC runtime function StringAssign does not correctly handle
  546.      strings of zero length.  Instead of calling StringAssign to convert
  547.      a zero-length string, simply return a near pointer to a doubleword 
  548.      with the value 0.
  549.  
  550.  
  551.  
  552. ======================< Part 4: Known Assembler Bugs >====================
  553.  
  554.      Exiting from MS-DOS Critical Errors
  555.      --------------------------------------------------
  556.      MS-DOS critical errors, such as attempting to assemble a file on
  557.      a drive which does not exist or is empty, produce the "Abort, Retry
  558.      or Fail?" error message.  Selecting "Abort" when running MASM in 
  559.      MS-DOS may cause memory to be corrupted.  This problem does not 
  560.      occur when running MASM in Windows.  To avoid this problem, select
  561.      "Retry" or "Fail", as appropriate.
  562.  
  563.  
  564.      Expression Order in High-Level Conditionals
  565.      --------------------------------------------------
  566.      Comparisons in high-level conditionals cannot begin with a literal.
  567.      For instance, this comparison causes an error:
  568.  
  569.       .IF 1 == AX
  570.  
  571.      but this works properly:
  572.  
  573.       .IF AX == 1
  574.  
  575.  
  576.      Hexadecimal Constants
  577.      ---------------------
  578.      In some instances, ML might not generate the appropriate error
  579.      message if it encounters a hexadecimal constant that does not have
  580.      an appending "h". The following will help to ensure that hexadecimal 
  581.      constants are properly represented:
  582.  
  583.      - Make sure that all hexadecimal constants have an appending "h".
  584.      - Begin all hexadecimal constants with the numeral 0. This ensures
  585.        that the compiler will generate the appropriate error message
  586.        if it encounters a hexadecimal constant that does not end in "h".
  587.  
  588.      
  589.      Initializing Nested Structures
  590.      --------------------------------------------------
  591.      If one structure is nested within another, the inner structure's
  592.      initializer list must either be empty or include a comma between
  593.      every field.  For example, the structure INFO declared on page 123 
  594.      of the Programmer's Guide contains a structure of type DISKDRIVES,
  595.      which in turn contains three BYTE fields.  An object of type INFO
  596.      could be initialized as:
  597.  
  598.       Info1 INFO { , , , , { }}      ; Inner initializer list is blank
  599.  
  600.      or as:
  601.  
  602.       Info1 INFO { , , , , {1, 2, }} ; Commas for all three fields
  603.  
  604.      but not as:
  605.  
  606.       Info1 INFO { , , , , {1, 2 }}  ; Error: missing last comma
  607.  
  608.  
  609.      Intersegment Near Jumps in Flat Model
  610.      -------------------------------------
  611.      Intersegment near jumps do not work across files (externs) in flat 
  612.      model. When programming in flat mode, make sure that all intersegment
  613.      near jumps occur within the same file.
  614.      
  615.      
  616.      Span-Dependent Expressions used in Macros
  617.      --------------------------------------------------
  618.      MASM 6.1x evaluates macro expressions only on the first pass of 
  619.      assembly, but code and data are reevaluated on subsequent passes.
  620.      Because of this, macro expressions which depend on the span between
  621.      two addresses may not evaluate correctly. For instance, the
  622.      following code will not evaluate correctly:
  623.  
  624.       Label1:
  625.            JMP Label2
  626.       Label2:
  627.  
  628.       REPEAT Label2 - Label1  ; Evaluates incorrectly
  629.            INC AX
  630.       ENDM
  631.  
  632.      View the listing file to determine if a questionable macro expression
  633.      was evaluated as desired.
  634.  
  635.  
  636.      Span-Dependent Equates in Macros and EXTERNDEF ABS
  637.      ---------------------------------------------------
  638.      The ABS operator causes an identifier to be exported as a relocatable
  639.      unsized constant (see Programmer's Guide page 220).  If ABS is used
  640.      with EXTERNDEF within a macro, and the constant being exported
  641.      depends on the difference between two addresses, the constant may not
  642.      be exported correctly.  In some cases, the listing file will show the
  643.      correct value, but the value in the resulting .obj will be incorrect.
  644.      For instance, the following code will not evaluate correctly:
  645.  
  646.       EXTERNDEF TableSize:ABS  ; Will not be exported correctly
  647.  
  648.       MAKETABLE MACRO
  649.       Table1 LABEL BYTE
  650.            DB 0, 1, 2
  651.       TableSize EQU $-Table1
  652.       ENDM
  653.  
  654.       SEG1 SEGMENT
  655.       MAKETABLE
  656.       SEG1 ENDS
  657.  
  658.      To avoid this problem, either use the 'PUBLIC' directive in place of 
  659.      'EXTERNDEF', or put a label before the equate, within the macro.
  660.  
  661.  
  662.      Span-Dependent Text Equates
  663.      --------------------------------------------------
  664.      The TEXTEQU operator is evaluated on the first assembly pass.  If
  665.      TEXTEQU is used with an expression that depends on the difference
  666.      between two addresses, the resulting constant may be incorrect.
  667.      For instance, the following code will not evaluate correctly:
  668.  
  669.       Label1:
  670.            JMP Label2
  671.       Label2:
  672.       WrongNum TEXTEQU %Label2-Label1 ; WrongNum will be incorrect
  673.  
  674.  
  675.      STRUCT and RECORD Initialization
  676.      --------------------------------
  677.      If a STRUCT containing a UNION is initialized incorrectly, it is
  678.      possible that the compiler might not generate an appropriate error.
  679.      If the UNION contains a RECORD, the STRUCT is initialized to the
  680.      default value for the original UNION.
  681.      
  682.      
  683.      Using The /link /nologo Command Line Options
  684.      ---------------------------------------------------------
  685.      The /link command line option for ML causes all following parameters
  686.      to be passed to the linker.  If the /nologo command line option 
  687.      is passed to the linker, the linker may parse other parameters
  688.      incorrectly.  To avoid this problem, use the /nologo command line 
  689.      switch for ML rather than passing it to the linker.  For instance,
  690.      replace:
  691.  
  692.       ML hello.asm /link /nologo MYLIB.LIB
  693.  
  694.      with:
  695.  
  696.       ML /nologo hello.asm /link MYLIB.LIB
  697.  
  698.      Alternately, you may use the NMAKE utility to automate building
  699.      your project.
  700.